﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SWBetongXaydung.DAL;
using SWBetongXaydung.Utils;
namespace SWBetongXaydung.BLL
{
    public class ThongKeNhienLieuTieuThu
    {
        public int SoPhieu { get; set; }
        public DateTime Ngay { get; set; }
        public string DienGiai { get; set; }
        public int SoChuyen { get; set; }
        public decimal NhienLieu { get; set; }
        public decimal TongLit { get { return NhienLieu * SoChuyen; } }
        public decimal DonGia { get; set; }
        public decimal ThanhTien { get { return DonGia * TongLit; } }
        public static List<ThongKeNhienLieuTieuThu> GetList(int thang, int nam, int IDTaiXe, string soXe, TYPE_REPORT loaiThongKe)
        {
            using (var db = DBContextHelper.GetContext())
            {
                decimal donGia = 0;
                var donGiaObj = DonGiaNhienLieuBLL.GetDonGia(thang, nam, soXe);
                if (donGiaObj != null)
                    donGia = donGiaObj.DonGia;
                else
                    donGia = 0;
                var xe = (from e in db.XeDbSet
                          where e.SoXe == soXe
                          select e).SingleOrDefault();
                if (xe == null)
                    throw new Exception("Xe " + soXe + " không tồn tại");
                var loaiXe = (from e in db.LoaiXeDbSet
                              where e.IDLoaiXe == xe.IDLoaiXe
                              select e).SingleOrDefault();
                if (loaiXe == null)
                    throw new Exception("Loại xe của xe " + soXe + " không tồn tại");
                var list = from e in db.DieuXeDbSet
                           where
                           e.IDTaiXe == IDTaiXe &&
                           e.SoXe == soXe &&
                           e.HanhTrinh.Ngay.Month == thang &&
                           e.HanhTrinh.Ngay.Year == nam &&
                           e.HanhTrinh.SoPhieu != -1
                           select e;
                if (loaiThongKe == TYPE_REPORT.BinhThuong)
                    list = list.Where(e => e.HanhTrinh.TinhTrang == 0 || e.HanhTrinh.TinhTrang == 1);
                else if (loaiThongKe == TYPE_REPORT.Thue)
                    list = list.Where(e => e.HanhTrinh.TinhTrang == 0 || e.HanhTrinh.TinhTrang == 2);
                else
                    list = list.Where(e => e.HanhTrinh.TinhTrang == 1 || e.HanhTrinh.TinhTrang == 2);
                var endList = list.Select(e => new ThongKeNhienLieuTieuThu
                {
                    DienGiai = (e.HanhTrinh.SoPhieu == -2) ? "Huế <=> Tứ Hạ" : (e.HanhTrinh.TramCapBeTong.TenTramCap + " => " + e.HanhTrinh.NoiDen + ((e.HanhTrinh.TinhTrang == 2)&& (loaiThongKe != TYPE_REPORT.Thue) ? "*" : "")),
                    DonGia = donGia,
                    Ngay = e.HanhTrinh.Ngay,
                    NhienLieu = ((loaiThongKe == TYPE_REPORT.CanDoi) && (e.HanhTrinh.TinhTrang == 2)) ? -1 * e.DinhMucNhienLieu : e.DinhMucNhienLieu,
                    SoChuyen = e.SoChuyen,
                    SoPhieu = e.HanhTrinh.SoPhieu
                }).OrderBy(e => e.Ngay).ToList();

                var ruaXe = GetRuaXe(thang, nam, IDTaiXe, soXe, loaiThongKe);
                if (ruaXe != null)
                    endList.Add(ruaXe);
                return endList;
            }
        }

        private static ThongKeNhienLieuTieuThu GetRuaXe(int thang, int nam, int IDTaiXe, string soXe, TYPE_REPORT loaiThongKe)
        {
            using (var db = DBContextHelper.GetContext())
            {
                decimal donGia = 0;
                var donGiaObj = DonGiaNhienLieuBLL.GetDonGia(thang, nam, soXe);
                if (donGiaObj != null)
                    donGia = donGiaObj.DonGia;
                else
                    donGia = 0;
                var xe = (from e in db.XeDbSet
                          where e.SoXe == soXe
                          select e).SingleOrDefault();
                if (xe == null)
                    throw new Exception("Xe " + soXe + " không tồn tại");
                var loaiXe = (from e in db.LoaiXeDbSet
                              where e.IDLoaiXe == xe.IDLoaiXe
                              select e).SingleOrDefault();
                if (loaiXe == null)
                    throw new Exception("Loại xe của xe " + soXe + " không tồn tại");
                var listRuaXe = from e in db.DieuXeDbSet
                                where e.IDTaiXe == IDTaiXe &&
                                e.SoXe == soXe &&
                                e.HanhTrinh.Ngay.Month == thang &&
                                e.HanhTrinh.Ngay.Year == nam &&
                                e.HanhTrinh.SoPhieu == -1
                                select e;
                if (loaiThongKe == TYPE_REPORT.BinhThuong)
                    listRuaXe = listRuaXe.Where(e => e.HanhTrinh.TinhTrang == 0 || e.HanhTrinh.TinhTrang == 1);
                else if (loaiThongKe == TYPE_REPORT.Thue)
                    listRuaXe = listRuaXe.Where(e => e.HanhTrinh.TinhTrang == 0 || e.HanhTrinh.TinhTrang == 2);
                else
                    listRuaXe = listRuaXe.Where(e => e.HanhTrinh.TinhTrang == 1 || e.HanhTrinh.TinhTrang == 2);
                var endList = listRuaXe.Select(e => new ThongKeNhienLieuTieuThu
                                 {
                                     DonGia = donGia,
                                     NhienLieu = e.DinhMucNhienLieu,
                                     SoChuyen = e.SoChuyen,
                                     SoPhieu = e.HanhTrinh.SoPhieu
                                 }).ToList();
                if (endList != null && endList.Count > 0)
                {
                    var ruaXe = new ThongKeNhienLieuTieuThu
                    {
                        DienGiai = "Rửa xe",
                        DonGia = donGia,
                        Ngay = StringUtils.ParseEndDateOfMonth(thang, nam),
                        NhienLieu = endList[0].NhienLieu,
                        SoChuyen = endList.Sum(e => e.SoChuyen),
                        SoPhieu = -1
                    };
                    return ruaXe;
                }
                return null;
            }
        }
    }
}
